package com.lzy.cloud.order.strategy;

import com.lzy.cloud.order.constants.CommonConstants;
import com.lzy.cloud.order.dtos.*;
import com.lzy.cloud.order.dtos.rvcar.CarSaleOrderDto;
import com.lzy.cloud.order.remote.GoodsApi;
import com.lzy.cloud.order.remote.ShopApi;
import com.lzy.cloud.order.remote.dtos.CarSaleDto;
import com.lzy.cloud.order.remote.dtos.GoodsDto;
import com.lzy.cloud.order.remote.dtos.ShopDto;
import com.lzy.cloud.order.service.*;
import com.lzy.framework.core.ensure.Ensure;
import com.lzy.framework.core.output.Result;
import com.lzy.framework.core.utils.DozerUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 房车销售订单相关业务
 * @Author:   gyl
 * @Date:     2018/7/6 16:11
 */
@Component("car/sale/order")
public class CarSaleOrderImpl implements StrategyOrder<CarSaleOrderDto> {

    private static final Logger LOGGER = LoggerFactory.getLogger(CarSaleOrderImpl.class);

    @Autowired
    private OrderInfoService orderInfoService;
    @Autowired
    private OrderInfoDetailService orderInfoDetailService;
    @Autowired
    private OrderInfoCarSaleService orderInfoCarSaleService;
    @Autowired
    private OrderExpenseItemService orderExpenseItemService;
    @Autowired
    private OrderStatusHistoryService orderStatusHistoryService;
    @Autowired
    private GoodsApi goodsApi;
    @Autowired
    private ShopApi shopApi;

    /**
     * 方法说明：房车销售订单新增
     * @param    dto 房车销订单对象
     * @return     订单支付信息
     * @date        2018/7/6 16:30
     */
    @Override
    public BaseOrderDto createOrder(CarSaleOrderDto dto) {

        // 查询车辆信息
        Result carSaleResult = goodsApi.selectById(1,dto.getCarId());
        CarSaleDto carSaleDto = DozerUtils.map(carSaleResult.getResult(), CarSaleDto.class);
        Ensure.that(carSaleDto).isNotNull("00000003");
        if (carSaleDto.getActivityPrice() != null) {
            dto.setSalePrice(new BigDecimal(carSaleDto.getActivityPrice().doubleValue() * 10000));
        } else {
            dto.setSalePrice(new BigDecimal(dto.getPrice().doubleValue() * 10000));
        }
        dto.setCarName(carSaleDto.getName());

        // TODO 查询车辆手动挡，驾照，床位
        // 处理房车销售订单
        dto = manageCarSale(dto);
        String orderId = dto.getOrderId();

        // 订单费用项目明细List
        List<OrderExpenseItemDto> orderExpenseItemDtoList = createOrderExpenseItemList(dto);
        dto.setOrderExpenseItemDtoList(orderExpenseItemDtoList);

        // 保存订单
        OrderInfoDto orderInfoDto = DozerUtils.map(dto, OrderInfoDto.class);
        Ensure.that(orderInfoService.create(orderInfoDto)).isTrue("00010002");

        // 保存订单详情
        OrderInfoDetailDto orderInfoDetailDto = DozerUtils.map(dto, OrderInfoDetailDto.class);
        orderInfoDetailDto.setGoodsId(dto.getCarId());
        Ensure.that(orderInfoDetailService.create(orderInfoDetailDto)).isTrue("00080001");

        // 保存房车销售
        OrderInfoCarSaleDto orderInfoCarSaleDto = DozerUtils.map(dto, OrderInfoCarSaleDto.class);
        orderInfoCarSaleDto.setAmount(dto.getCount());
        orderInfoCarSaleDto.setNormalPrice(dto.getPrice());
        Ensure.that(orderInfoCarSaleService.create(orderInfoCarSaleDto)).isTrue("00070001");

        // 保存订单费用项目明细
        for (OrderExpenseItemDto oeiDto: orderExpenseItemDtoList) {
            oeiDto.setOrderId(orderId);
            Ensure.that(orderExpenseItemService.create(oeiDto)).isGt(0,"00030001");
        }

        // 发送短信
//		Integer countMin = kvClient.read(OrderDistributePrefix.TOURCARSALE_PAY_TIME, Integer.class);
//		orderMsgApi.carSalePayWait(orderInfo.getUserId(), countMin);

        // 订单过期队列
//        OrderMessageDTO dto = new OrderMessageDTO();
//        dto.setOrderId(orderId);
//        dto.setMinStatus(OrderSatusDesEnum.TOURCARSALE_NO_PAY.getStatus());
//        kvClient.addQueue(OrderDistributePrefix.QueueOrder.QUEUE_ORDER_MESSAGE, dto);
//        LOGGER.error("房车销售待支付加入消息队列成功，订单号：" + orderId);

        return dto;
    }

    @Override
    public PayOrderMoneyDto confirmPay(CarSaleOrderDto dto) {
        // 判断是否启用余额支付
        Ensure.that(dto.getBalanceType() != null && (dto.getBalanceType().equals(1) || dto.getBalanceType().equals(2))).isTrue("08000030");

        // 费用明细
        List<OrderExpenseItemDto> orderExpenseItemDtoList = confirmPayExpenseItemList(dto);

        // 保存订单费用项目明细
        for (OrderExpenseItemDto oeiDto: orderExpenseItemDtoList) {
            oeiDto.setOrderId(dto.getOrderId());
            Ensure.that(orderExpenseItemService.create(oeiDto)).isGt(0,"00030001");
        }

        // 返回需要支付的订单的信息
        PayOrderMoneyDto orderMoneyDTO = new PayOrderMoneyDto();
        orderMoneyDTO.setOrderId(dto.getOrderId());
        orderMoneyDTO.setOrderAmount(dto.getOrderAmount());
        orderMoneyDTO.setType(dto.getType());
        orderMoneyDTO.setPayTime(dto.getStopPayTime());
        return orderMoneyDTO;
    }

    /**
     * 方法说明：根据订单号查询订单详情
     * @param    orderId 订单号
     * @return     订单基本信息
     * @date        2018/7/6 16:32
     */
    @Override
    public BaseOrderDto selectOrderByOrderId(String orderId) {
        // 订单主表
        OrderInfoDto orderInfoDto = orderInfoService.find(orderId);
        Ensure.that(orderInfoDto).isNotNull("00010007");
        CarSaleOrderDto dto = DozerUtils.map(orderInfoDto, CarSaleOrderDto.class);

        // 订单详情
        OrderInfoDetailDto orderInfoDetailDto = orderInfoDetailService.find(orderId);
        Ensure.that(orderInfoDetailDto).isNotNull("00080007");
        dto.setGoodsAmount(orderInfoDetailDto.getGoodsAmount());
        dto.setOnline(orderInfoDetailDto.getOnline());
        dto.setSource(orderInfoDetailDto.getSource());
        dto.setSourceId(orderInfoDetailDto.getSourceId());
        dto.setStopPayTime(orderInfoDetailDto.getStopPayTime());
        dto.setCompleteTime(orderInfoDetailDto.getCompleteTime());
        dto.setRemark(orderInfoDetailDto.getRemark());

        // 房车销售订单
        OrderInfoCarSaleDto orderInfoCarSaleDto = orderInfoCarSaleService.queryByOrderId(orderId);
        Ensure.that(orderInfoCarSaleDto).isNotNull("00070007");
        dto.setShopId(orderInfoCarSaleDto.getShopId());
        dto.setShopName(orderInfoCarSaleDto.getShopName());
        dto.setCarId(orderInfoCarSaleDto.getCarId());
        dto.setCarName(orderInfoCarSaleDto.getCarName());
        dto.setLiftName(orderInfoCarSaleDto.getLiftName());
        dto.setLiftPhone(orderInfoCarSaleDto.getLiftPhone());
        dto.setAmount(orderInfoCarSaleDto.getAmount());
        dto.setSalePrice(orderInfoCarSaleDto.getSalePrice());
        dto.setNormalPrice(orderInfoCarSaleDto.getNormalPrice());
        dto.setMoneyCount(orderInfoCarSaleDto.getMoneyCount());
        dto.setMemberId(orderInfoCarSaleDto.getMemberId());
        dto.setMemberName(orderInfoCarSaleDto.getMemberName());
        dto.setMemberPhone(orderInfoCarSaleDto.getMemberPhone());

        // 订单费用项目明细
        List<OrderExpenseItemDto> orderExpenseItemDtoList = orderExpenseItemService.queryListByOrderId(orderId);
        Ensure.that(orderExpenseItemDtoList).isNotNull("00030007");
        dto.setOrderExpenseItemDtoList(orderExpenseItemDtoList);

        // 订单状态变化记录
        List<OrderStatusHistoryDto> orderStatusHistoryDtoList = orderStatusHistoryService.queryListByOrderId(orderId);
        Ensure.that(orderStatusHistoryDtoList).isNotNull("00170007");
        dto.setOrderStatusHistoryDtoList(orderStatusHistoryDtoList);

        // 车辆
        Result goodsResult = goodsApi.selectById(2, dto.getCarId());
        GoodsDto goodsDto = DozerUtils.map(goodsResult.getResult(), GoodsDto.class);
        Ensure.that(goodsDto).isNotNull("00180007");

        // 店铺
        Result shopResult = shopApi.selectById(dto.getShopId());
        ShopDto shopDto = DozerUtils.map(shopResult.getResult(), ShopDto.class);
        Ensure.that(shopDto).isNotNull("00190007");

        dto.setShopName(shopDto.getName());
        dto.setShopAddress(shopDto.getAddress());
        dto.setShopPhone(shopDto.getCantactPhone());
        dto.setCarImage(goodsDto.getImage());
        dto.setCarParamDtoList(goodsDto.getCarRentDto().getCarParamDtoList());

        return dto;
    }

    @Override
    public Boolean cancel(BaseOrderDto dto) {
        return Boolean.TRUE;
    }

    @Override
    public Boolean confirm(BaseOrderDto dto) {
        return Boolean.TRUE;
    }

    /**
     * 确认支付-房车租赁费用明细list
     *
     * @param dto
     * @return
     */
    private List<OrderExpenseItemDto> confirmPayExpenseItemList(CarSaleOrderDto dto) {
        ArrayList<OrderExpenseItemDto> oemDtoList = new ArrayList<>();

        OrderExpenseItemDto oemDto = null;

        BigDecimal directAmount = dto.getDirectAmount();
        if (dto.getBalanceType().equals(1)) { // 用余额支付

            if (directAmount.compareTo(dto.getOrderAmount()) >= 0) { // 余额直接提现部分 够付
                dto.setBalancePaid(dto.getOrderAmount());
                dto.setOrderAmount(BigDecimal.ZERO);

                // 余额直接提现部分
                oemDto = new OrderExpenseItemDto();
                oemDto.setType(CommonConstants.OrderExpenseItemType.DIRECT_AMOUNT);
                oemDto.setAmount(dto.getOrderAmount());
                oemDto.setWay(CommonConstants.OrderExpenseItemWay.DEDUCTIBLE_ITEM);
                oemDtoList.add(oemDto);
            } else { // 余额直接提现部分 不够付
                dto.setBalancePaid(directAmount);
                dto.setOrderAmount(dto.getOrderAmount().subtract(directAmount));

                // 余额直接提现部分
                oemDto = new OrderExpenseItemDto();
                oemDto.setType(CommonConstants.OrderExpenseItemType.DIRECT_AMOUNT);
                oemDto.setAmount(directAmount);
                oemDto.setWay(CommonConstants.OrderExpenseItemWay.DEDUCTIBLE_ITEM);
                oemDtoList.add(oemDto);
            }
        } else { // 不用余额支付
            dto.setBalancePaid(BigDecimal.ZERO);
        }

        return oemDtoList;
    }

    /**
     * 创建订单-订单费用项目明细List
     * @param dto
     * @return
     */
    private List<OrderExpenseItemDto> createOrderExpenseItemList(CarSaleOrderDto dto) {
        //1.1总价
        ArrayList<OrderExpenseItemDto> oemDtoList = new ArrayList<>();
        //1.3平台服务费
        BigDecimal platFormFee = dto.getPlatFormFee();

        //商品总价格= 订金*amount
        dto.setMoneyCount(new BigDecimal(dto.getDepositPrice().doubleValue() * dto.getCount()));
        if (platFormFee != null) {
            //订单价格= 商品总价格 + 平台服务费
            dto.setOrderAmount(new BigDecimal(dto.getDepositPrice().doubleValue() * dto.getCount() + platFormFee.doubleValue()));

            // 平台服务费
            OrderExpenseItemDto oemDto = new OrderExpenseItemDto();
            oemDto.setType(CommonConstants.OrderExpenseItemType.PLATFORM);
            oemDto.setAmount(platFormFee);
            oemDto.setWay(CommonConstants.OrderExpenseItemWay.CHARGE_ITEM);
            oemDtoList.add(oemDto);
        } else {
            //订单价格= 商品总价格
            dto.setOrderAmount(new BigDecimal(dto.getDepositPrice().doubleValue() * dto.getCount()));
        }

        // 商品总价
        OrderExpenseItemDto oemDto = new OrderExpenseItemDto();
        oemDto.setType(CommonConstants.OrderExpenseItemType.TOTAL_PRICE);
        oemDto.setAmount(dto.getOrderAmount());
        oemDto.setWay(CommonConstants.OrderExpenseItemWay.CHARGE_ITEM);
        oemDtoList.add(oemDto);

        // 在线支付部分
        oemDto = new OrderExpenseItemDto();
        oemDto.setType(CommonConstants.OrderExpenseItemType.ONLINE_AMOUNT);
        oemDto.setAmount(dto.getOrderAmount());
        oemDto.setWay(CommonConstants.OrderExpenseItemWay.DEDUCTIBLE_ITEM);
        oemDtoList.add(oemDto);

        return oemDtoList;
    }

    /**
     * 处理房车销售订单
     * @param dto
     * @return
     */
    private CarSaleOrderDto manageCarSale(CarSaleOrderDto dto) {
        String desc = "";//字符串格式：“手动档｜准驾A2照｜床位1个”  //stone
        //1手动 2自动 3无动力
        if (dto.getGearBox() != null) {
            if (dto.getGearBox().intValue() == 1) {
                desc += "手动" + "档|";
            } else if (dto.getGearBox().intValue() == 2) {
                desc += "自动" + "档|";
            } else if (dto.getGearBox().intValue() == 3) {
                desc += "无动力" + "|";
            } else {
                desc += "手动" + "档|";
            }
        }
        //驾照
        if (dto.getDrivingLicense() != null) {
            if (dto.getDrivingLicense().contains("照")) {
                desc += "准驾" + dto.getDrivingLicense() + "|";
            } else {
                desc += "准驾" + dto.getDrivingLicense() + "照|";
            }
        }
        if (dto.getBedNumber() != null) {
            desc += "床位" + dto.getBedNumber() + "个|";
        }
        if (desc.length() > 0) {
            desc = desc.substring(0, desc.length() - 1);
        }
        dto.setTitle(desc);

        return dto;
    }
}
